/**
 * BrandBigData.com Inc.
 * Copyright (c) 2016 All Rights Reserved.
 */
package com.qibao.toolkit.protocol.facade;

import com.qibao.toolkit.protocol.exception.ProtocolException;

/**
 * 协议，负责发起请求，获得结果
 *
 * @author xumin
 * @version $Id:Protocol.java, v0.1 2017/6/14 8:42 xumin
 */
public interface Protocol {

    /**
     * 发起请求
     *
     * @param request               请求
     * @param protocolConfiguration 协议配置
     * @return 响应
     * @throws ProtocolException
     */
    Response sendRequest(Request request, ProtocolConfiguration protocolConfiguration) throws ProtocolException;

    /**
     * 根据http请求响应，从业务数据角度判断请求是否需要重试
     * <p>
     * 该类主要是根据业务数据来判断是否需要重试，并非是连接异常或者传输超时等。
     * 1.比如关联方数据：系统 -> gxp -> 关联方。 gxp->到关联方sockte异常， 我们系统会收到来自gxp http状态200的响应，但是gxp状态为网异常，这种情况就不能依据http状态码来定义是否重试。
     * 2.查询关联方数据时，authcode过期，或者无效，这种情况http通信是正常的，但是根据业务需要，是需要重试来获取新的authcode值的。
     * </p>
     *
     * @param response http请求的响应
     * @return true, 重试；false，不重试
     */
    default boolean retryCondition(Response response) {
        return Boolean.FALSE;
    }
}
